first binary: 9F2938
geo: 803AE6D0
tex: 803ACA00, 803ACE00
rgb: 

SET THE BREAK ON 803B0A30

800148A4:	use tex 803ACE00
ADDIU	SP,SP,FFE8
SW	S0,0010 (SP)
ADDU	S0,A0,R0
SW	RA,0014 (SP)
LW	A0,0004 (S0)	;A0=p->tex values
LBU	V1,0000 (A0)	;V1=tex1, high byte
ADDIU	V0,R0,0045
BNE	V1,V0,80014948	;branch if tex1!=0x45XX
ADDIU	V0,R0,FFFD	;V0=-3
//800148C8:
LBU	V1,0001 (A0)	;V1=tex1, low byte
ADDIU	V0,R0,0044
BNE	V1,V0,80014948	;branch if tex1!=0xXX44
ADDIU	V0,R0,FFFD	;V0=-3
//800148D8:
LBU	V1,0002 (A0)	;V1=tex2, high byte
ADDIU	V0,R0,004C
BNE	V1,V0,80014948	;branch if tex2!=0x4CXX
ADDIU	V0,R0,FFFD	;V0=-3
//800148E8:
LBU	V0,0003 (A0)	;V0=tex2, low byte
LW	V1,0004 (S0)	;A0=p->tex values
SRL	V0,V0,0x7	;V0/=0x80
SW	V0,0018 (S0)
LBU	V0,0003 (V1)	;V0=tex2, low byte
ANDI	V1,V0,007F	;V1=V0%80
SLTI	V0,V1,0003
BEQ	V0,R0,80014944	;if (V0%80)>3, branch
SW	V1,0010 (S0)
BLTZ	V1,80014948	;how precisely could this ever be less than zero?
ADDIU	V0,R0,FFFC	;V0=-4
//80014914:
LW	V0,0004 (S0)
SW	R0,001C (S0)
LW	A1,0004 (V0)
JAL	8001495C
ADDU	A0,S0,R0
LW	V1,0004 (S0)
SW	V0,0008 (S0)
LW	A1,0008 (V1)
JAL	8001495C
ADDU	A0,S0,R0
J	8001494C
SW	V0,000C (S0)
//80014944:
ADDIU	V0,R0,FFFC
//80014948:
SW	V0,001C (S0)	;SP+1C=-3
LW	RA,0014 (SP)
LW	S0,0010 (SP)
JR	RA
ADDIU	SP,SP,0018

8001495C:
LW	V1,0018 (A0)
LW	V0,0014 (A0)
BEQ	V1,V0,80014990
SRL	V1,A1,0x18
SRL	V0,A1,0x8
ANDI	V0,V0,FF00
ADDU	V1,V1,V0
ANDI	V0,A1,FF00
SLL	V0,V0,0x8
ADDU	V1,V1,V0
SLL	V0,A1,0x18
J	80014994
ADDU	V0,V1,V0
//80014990:
ADDU	V0,A1,R0
JR	RA
NOP


800A10A4:	copy from buffer 1 to 2
	accepts: A0=p->target, A1=p->source, A2=size
BEQ	A2,R0,800A10C4	;if size=0, don't do anything
ADDU	V1,A0,R0	;V1=target
LBU	V0,0000 (A1)
ADDIU	A1,A1,0001
ADDIU	A2,A2,FFFF
SB	V0,0000 (V1)
BNEZ	A2,800A10AC
ADDIU	V1,V1,0001
//800A10C4:
JR	RA
ADDU	V0,A0,R0

+-+-+-+

800328CC:	write one point to a point list!
	accepts: A0=p->target, A1=p->source floats, A2=p->RGBA values, A3=p->tex coords, SP+10=index for point, SP+14=index for texture coords, SP+18=index for RGBA, SP+1C=scale
LW	V1,0010 (SP)	;V1=SP+10: index for point to be converted
LWC1	F4,001C (SP)	;F4=SP+1C: scale factor
SLL	V0,V1,0x1
ADDU	V0,V0,V1
SLL	V0,V0,0x2	;V0=index * C
ADDU	A1,A1,V0
//800328E4:	translate x float and write to table
LWC1	F0,0000 (A1)	;F0=(float) x
MUL.S	F0,F0,F4	;F0*=1.0
LUI	AT,4280
MTC1	AT,F2
NOP
MUL.S	F0,F0,F2	;F0*=64.0
TRUNC.W.S	F6,F0
MFC1	V0,F6
NOP
SH	V0,0000 (A0)	;save to [803B0A30]
//8003290C:	translate y float and write to table
LWC1	F0,0004 (A1)	;F0=(float) y
MUL.S	F0,F0,F4	;F0*=1.0
NOP
MUL.S	F0,F0,F2	;F0*=64.0
TRUNC.W.S	F6,F0
MFC1	V0,F6
NOP
SH	V0,0002 (A0)	;save to [803B0A32]
//8003292C:	translate z float and write to table
LWC1	F0,0004 (A1)	;F0=(float) z
MUL.S	F0,F0,F4	;F0*=1.0
NOP
MUL.S	F0,F0,F2	;F0*=64.0
LW	V0,0014 (SP)	;V0=SP+14: index for texture coords
SLL	V0,V0,0x2	;V0*=4
ADDU	V0,V0,A3	;V0=p->tex vals
TRUNC.W.S	F2,F0
MFC1	V1,F2
NOP
SH	V1,0004 (A0)	;save to [803B0A34]
//80032958:	copy on texture coordinates
LW	V1,0000 (V0)	;V1=tex vals
LW	V0,0018 (SP)	;V0=index for RGBA
SLL	V0,V0,0x2	;V0*=4
ADDU	A2,A2,V0	;A2=p->RGBA
SW	V1,0008 (A0)	;save tex
//8003296C:	copy on RGBA value and return
LW	V0,0000 (A2)	;V0=RGBA value
JR	RA
SW	V0,000C (A0)	;save RGBA


800336FC:	THIS IS IT!!	generate a nice, fine DL from all that data
...
//8003378C:
BEQ	V0,R0,80033F20	;if type>=C, branch
SLL	V0,V1,0x2	;type->offset
LUI	AT,800D
ADDU	AT,AT,V0
LW	V0,2E68 (AT)	;V0=800D2E68+offset: jump to microcode type handler
JR	V0
NOP

800337A8:	type 9
J	80033F20
ADDIU	S1,S1,0004	;advance 4 bytes

800337B0:	type 0
ADDIU	V1,S1,0002
LBU	V0,0001 (S1)
LUI	S4,8011
LW	S4,D2B4 (S4)
BEQ	V0,R0,8003383C
ADDU	S2,R0,R0
ADDU	S0,V1,R0
LBU	V0,0000 (S0)
LBU	V1,0001 (S0)
LBU	T0,0002 (S0)
BEQ	S3,R0,8003381C
ADDU	A1,S7,R0
LUI	A0,8011
LW	A0,D2B4 (A0)
LW	A3,002C (SP)
ADDU	A2,S8,R0
SW	V0,0010 (SP)
SW	V1,0014 (SP)
SW	T0,0018 (SP)
JAL	800328CC
SWC1	F20,001C (SP)
LUI	V0,8011
LW	V0,D2B4 (V0)
ADDIU	V0,V0,0010
LUI	AT,8011
J	80033828
SW	V0,D2B4 (AT)
LW	V0,0000 (S6)
ADDIU	V0,V0,0001
SW	V0,0000 (S6)
LBU	V0,0001 (S1)
ADDIU	S2,S2,0001
SLTU	V0,S2,V0
BNEZ	V0,800337CC
ADDIU	S0,S0,0003
BEQ	S3,R0,80033888
NOP	
LUI	A1,8011
LW	A1,A510 (A1)
ADDIU	V0,A1,0008
LUI	AT,8011
SW	V0,A510 (AT)
LBU	V1,0001 (S1)
LUI	V0,8000
SUBU	V0,S4,V0
SW	V0,0004 (A1)
LUI	V0,0100
SLL	A0,V1,0xC
ANDI	V1,V1,007F
SLL	V1,V1,0x1
OR	V1,V1,V0
OR	A0,A0,V1
J	80033894
SW	A0,0000 (A1)
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)
ADDIU	S1,S1,0001
LBU	V1,0000 (S1)
SLL	V0,V1,0x1
J	80033BA4
ADDU	V0,V0,V1

800338A8:	type 1
ADDIU	V1,S1,0002
LBU	V0,0001 (S1)
LUI	S4,8011
LW	S4,D2B4 (S4)
BEQ	V0,R0,80033958
ADDU	S2,R0,R0
ADDU	S0,V1,R0
LBU	V0,0000 (S0)
LBU	A0,0001 (S0)
LBU	V1,0002 (S0)
LBU	A1,0005 (S0)
SLL	V0,V0,0x8
ADDU	T0,V0,A0
LBU	A0,0003 (S0)
LBU	V0,0004 (S0)
SLL	V1,V1,0x8
ADDU	V1,V1,A0
SLL	V0,V0,0x8
BEQ	S3,R0,80033938
ADDU	V0,V0,A1
LUI	A0,8011
LW	A0,D2B4 (A0)
LW	A3,002C (SP)
ADDU	A1,S7,R0
ADDU	A2,S8,R0
SW	T0,0010 (SP)
SW	V1,0014 (SP)
SW	V0,0018 (SP)
JAL	800328CC
SWC1	F20,001C (SP)
LUI	V0,8011
LW	V0,D2B4 (V0)
ADDIU	V0,V0,0010
LUI	AT,8011
J	80033944
SW	V0,D2B4 (AT)
LW	V0,0000 (S6)
ADDIU	V0,V0,0001
SW	V0,0000 (S6)
LBU	V0,0001 (S1)
ADDIU	S2,S2,0001
SLTU	V0,S2,V0
BNEZ	V0,800338C4
ADDIU	S0,S0,0006
BEQ	S3,R0,800339A4
NOP	
LUI	A1,8011
LW	A1,A510 (A1)
ADDIU	V0,A1,0008
LUI	AT,8011
SW	V0,A510 (AT)
LBU	V1,0001 (S1)
LUI	V0,8000
SUBU	V0,S4,V0
SW	V0,0004 (A1)
LUI	V0,0100
SLL	A0,V1,0xC
ANDI	V1,V1,007F
SLL	V1,V1,0x1
OR	V1,V1,V0
OR	A0,A0,V1
J	800339B0
SW	A0,0000 (A1)
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)
ADDIU	S1,S1,0001
LBU	V1,0000 (S1)
SLL	V0,V1,0x1
J	80033BA0
ADDU	V0,V0,V1

800339C4:	type 3	vertices list - 8bit index of corresponding positions, tex verts, and RGBA data
ADDIU	V1,S1,0002	;V1=p->vertex list
LBU	V0,0001 (S1)	;V0=number of entries
LUI	S4,8011
LW	S4,D2B4 (S4)	;S4=8010D2B4: p->point table
BEQ	V0,R0,80033A48	;do nothing with a NULL list
ADDU	S2,R0,R0	;S2=0
ADDU	S0,V1,R0	;S0=V1:	p->vertex list
LBU	V0,0000 (S0)	;V0=vert1
BEQ	S3,R0,80033A28
ADDU	A1,S7,R0	;A1=S7:	???
LUI	A0,8011
LW	A0,D2B4 (A0)	;A0=8010D2B4:	p->point table
LW	A3,002C (SP)	;A3=SP+2C:	???
ADDU	A2,S8,R0	;A2=S8:	???
SW	V0,0010 (SP)	;save vert1 index
SW	V0,0014 (SP)	;save vert1 index
SW	V0,0018 (SP)	;save vert1 index
JAL	800328CC	;writes one point to the point list
SWC1	F20,001C (SP)	;save scale modifier or something?
//80033A10:	write point to table
LUI	V0,8011
LW	V0,D2B4 (V0)	;V0=8010D2B4:	p->point table
ADDIU	V0,V0,0010	;V0+=10:	p->next point table entry
LUI	AT,8011
J	80033A34
SW	V0,D2B4 (AT)	;save new point table position
//80033A28:
LW	V0,0000 (S6)
ADDIU	V0,V0,0001
SW	V0,0000 (S6)	;increment value at S6
//80033A34:	test if list is finished
LBU	V0,0001 (S1)	;V0=total # points
ADDIU	S2,S2,0001	;S2++	count++
SLTU	V0,S2,V0
BNEZ	V0,800339E0	;branch if you've extracted all the entries
ADDIU	S0,S0,0001	;S0++	next entry in microcode
BEQ	S3,R0,80033A94
NOP	
LUI	A1,8011
LW	A1,A510 (A1)	;A1=8010A510: p->DL command position
ADDIU	V0,A1,0008	;V0=A1+8	p->next command position
LUI	AT,8011
SW	V0,A510 (AT)	;save new position
LBU	V1,0001 (S1)	;V1=count
LUI	V0,8000
SUBU	V0,S4,V0	;V0=80000000-rdram address of vertices: vertex lower word
SW	V0,0004 (A1)	;save vertex command lower word
LUI	V0,0100
SLL	A0,V1,0xC	;A0=count*10*100:	size of vertex bank
ANDI	V1,V1,007F
SLL	V1,V1,0x1	;V1=#vertices*2
OR	V1,V1,V0
OR	A0,A0,V1	;A0=01.FFFF.FE: vertex command upper word
J	80033AA0
SW	A0,0000 (A1)	;save vertex command upper word
//80033A94:
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)	;increment value at S5
//80033AA0:
ADDIU	S1,S1,0001	;pos++
LBU	V0,0000 (S1)
J	80033BA8
ADDIU	V0,V0,0001

80033AB0:	type 2
ADDIU	V1,S1,0002	;V1=p->vertex list
LBU	V0,0001 (S1)	;V0=# entries
LUI	S4,8011
LW	S4,D2B4 (S4)	;S4=8010D2B4: p->point table
BEQ	V0,R0,80033B40	;do nothing with a NULL list
ADDU	S2,R0,R0	;S2=0	bytecount=0
ADDU	S0,V1,R0	;S0=V1: p->vertex list
LBU	V0,0000 (S0)	;V0=byte1
LBU	V1,0001 (S0)	;V1=byte2
SLL	V0,V0,0x8
BEQ	S3,R0,80033B20
ADDU	V0,V0,V1	;V0=byte1.byte2: 16bit index value
LUI	A0,8011
LW	A0,D2B4 (A0)	;A0=8010D2B4: p->point table
LW	A3,002C (SP)
ADDU	A1,S7,R0
ADDU	A2,S8,R0
SW	V0,0010 (SP)
SW	V0,0014 (SP)
SW	V0,0018 (SP)
JAL	800328CC
SWC1	F20,001C (SP)
LUI	V0,8011
LW	V0,D2B4 (V0)
ADDIU	V0,V0,0010
LUI	AT,8011
J	80033B2C
SW	V0,D2B4 (AT)
LW	V0,0000 (S6)
ADDIU	V0,V0,0001
SW	V0,0000 (S6)
LBU	V0,0001 (S1)
ADDIU	S2,S2,0001
SLTU	V0,S2,V0
BNEZ	V0,80033ACC
ADDIU	S0,S0,0002
BEQ	S3,R0,80033B8C
NOP	
LUI	A1,8011
LW	A1,A510 (A1)
ADDIU	V0,A1,0008
LUI	AT,8011
SW	V0,A510 (AT)
LBU	V1,0001 (S1)
LUI	V0,8000
SUBU	V0,S4,V0
SW	V0,0004 (A1)
LUI	V0,0100
SLL	A0,V1,0xC
ANDI	V1,V1,007F
SLL	V1,V1,0x1
OR	V1,V1,V0
OR	A0,A0,V1
J	80033B98
SW	A0,0000 (A1)
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)
ADDIU	S1,S1,0001
LBU	V0,0000 (S1)
SLL	V0,V0,0x1
ADDIU	V0,V0,0001
J	80033F20
ADDU	S1,S1,V0

80033BB0:	type 6
LW	A2,00A0 (SP)
LW	A3,00A8 (SP)
LW	T5,00AC (SP)
ADDU	A0,S1,R0
ADDIU	A1,SP,0020
SW	S3,0014 (SP)
SW	S5,0018 (SP)
JAL	800334A4
SW	T5,0010 (SP)
LW	A1,00A0 (SP)
LW	A2,00A8 (SP)
LW	A3,00AC (SP)
ADDIU	S1,S1,0001
ADDU	A0,S1,R0
SW	S3,0010 (SP)
JAL	80032978
SW	S5,0014 (SP)
J	80033C48
ADDIU	S1,S1,0001

80033BFC:	type 7
LW	A1,00A0 (SP)	;A1=image type
LW	A2,00A8 (SP)	;A2=p->image index
LW	A3,00AC (SP)	;A3=p->palette index
ADDU	A0,S1,R0	;A0=S1: p->geocode
SW	S3,0010 (SP)	;SP+10=S3: 
JAL	80032978	;set texture
SW	S5,0014 (SP)	;SP+14=S5: 
//80033C18:	set palette for texture above
LW	A2,00A0 (SP)	;A2=image type(probably)
LW	A3,00A8 (SP)	;A3=p->image index
LW	T5,00AC (SP)	;T5=p->palette index
ADDU	A0,S1,R0	;A0=S1: p->geocode
ADDIU	A1,SP,0020	;A1=SP+20: 
SW	S3,0014 (SP)	;SP+14=S3: 
SW	S5,0018 (SP)	;SP+18=S5: 
JAL	800334A4	;set palette
SW	T5,0010 (SP)	;SP+10=T5: p->palette index
//80033C3C:	jump to triangle drawing
J	80033C48
ADDIU	S1,S1,0001

80033C44:	type 8	gaussian triads - technically unsupported, surprisingly
ADDIU	S1,S1,0003	;S1+=3:	increment pos past RGB data

80033C48:	type 5	basic draw triangle command
LBU	T3,0001 (S1)
ADDIU	S1,S1,0002
SRL	V0,T3,0x1
BEQ	V0,R0,80033D18
ADDU	S2,R0,R0
ADDU	T4,V0,R0
ADDIU	A1,S1,0002
LBU	V1,0000 (S1)
LBU	A2,FFFF (A1)
LBU	A3,0000 (A1)
ADDIU	A1,A1,0003
ADDIU	S1,S1,0003
LBU	T0,0000 (S1)
LBU	T1,FFFF (A1)
LBU	T2,0000 (A1)
BEQ	S3,R0,80033CF8
LUI	T5,0600
LUI	A0,8011
LW	A0,A510 (A0)
ADDIU	V0,A0,0008
LUI	AT,8011
SW	V0,A510 (AT)
SLL	V0,V1,0x1
ANDI	V0,V0,00FF
SLL	V0,V0,0x10
SLL	V1,A2,0x9
ANDI	V1,V1,FE00
OR	V0,V0,V1
SLL	V1,A3,0x1
ANDI	V1,V1,00FF
OR	V0,V0,V1
OR	V0,V0,T5
SLL	V1,T0,0x1
ANDI	V1,V1,00FF
SLL	V1,V1,0x10
SW	V0,0000 (A0)
SLL	V0,T1,0x9
ANDI	V0,V0,FE00
OR	V1,V1,V0
SLL	V0,T2,0x1
ANDI	V0,V0,00FF
OR	V1,V1,V0
J	80033D04
SW	V1,0004 (A0)
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)
ADDIU	A1,A1,0003
ADDIU	S2,S2,0001
SLTU	V0,S2,T4
BNEZ	V0,80033C64
ADDIU	S1,S1,0003
ANDI	V0,T3,0001
BEQ	V0,R0,80033F20
NOP	
LBU	V1,0000 (S1)
LBU	A2,0001 (S1)
LBU	A3,0002 (S1)
BEQ	S3,R0,80033D80
SLL	V1,V1,0x1
LUI	A0,8011
LW	A0,A510 (A0)
ANDI	V1,V1,00FF
SLL	V1,V1,0x10
LUI	T5,0500
ADDIU	V0,A0,0008
LUI	AT,8011
SW	V0,A510 (AT)
SLL	V0,A2,0x9
ANDI	V0,V0,FE00
OR	V1,V1,V0
SLL	V0,A3,0x1
ANDI	V0,V0,00FF
OR	V1,V1,V0
OR	V1,V1,T5
SW	V1,0000 (A0)
J	80033D8C
SW	R0,0004 (A0)
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)
J	80033F20
ADDIU	S1,S1,0003

80033D94:	type 4	single triad write, written in sets of two funny enough!
LBU	V0,0000 (S1)	;V0=byte1
ADDIU	T5,R0,0004	;T5=4
BNE	V0,T5,80033F20	;branch if byte 1 doesn't equal 4...
ADDIU	A1,S1,0007	;A1=curpos+7
//80033DA4:
LBU	V1,FFFA (A1)	;V1=byte2
LBU	V0,FFFD (A1)	;V0=byte5
LBU	A2,FFFB (A1)	;A2=byte3
LBU	A3,FFFC (A1)	;A3=byte4
ADDIU	T5,R0,0004	;T5=4
BNE	V0,T5,80033E58	;branch if byte 5 doesn't equal 4...
NOP	
//80033DC0:	tri-2 write
LBU	T0,FFFE (A1)	;T0=byte6
LBU	T1,FFFF (A1)	;T1=byte7
LBU	T2,0000 (A1)	;T2=byte8
BEQ	S3,R0,80033E40
LUI	T5,0600
LUI	A0,8011
LW	A0,A510 (A0)	;A0=current DL command offset
ADDIU	V0,A0,0008	;V0=offset to next command
LUI	AT,8011
SW	V0,A510 (AT)	;save new command position
SLL	V0,V1,0x1
ANDI	V0,V0,00FF	;V0=byte2*2:	vertex 1 of tri 1
SLL	V0,V0,0x10
SLL	V1,A2,0x9
ANDI	V1,V1,FE00	;V0=byte3*200:	vertex 2 of tri 1
OR	V0,V0,V1
SLL	V1,A3,0x1
ANDI	V1,V1,00FF	;V1=byte4*2:	vertex 3 of tri 1
OR	V0,V0,V1
OR	V0,V0,T5	;V0=tri2 command upper word: 06FEFEFE
SLL	V1,T0,0x1
ANDI	V1,V1,00FF
SLL	V1,V1,0x10	;V1=byte6*20000: vertex 1 of tri 2
SW	V0,0000 (A0)	;save tri2 command upper word
SLL	V0,T1,0x9
ANDI	V0,V0,FE00	;V0=byte7*200:	vertex 2 of tri 2
OR	V1,V1,V0
SLL	V0,T2,0x1
ANDI	V0,V0,00FF	;V0=byte8*2:	vertex 3 of tri 2
OR	V1,V1,V0	;V1=tri2 command lower word: 00FEFEFE
J	80033E4C
SW	V1,0004 (A0)	;save tri2 command lower word
//80033E40:
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)	;increment value at S5
//80033E4C:
ADDIU	A1,A1,0008	;curpos+=8
J	80033EBC	;loopus more 04 commands
ADDIU	S1,S1,0008	;position+=8
//80033E58:	single triad write
BEQ	S3,R0,80033EA8
LUI	T5,0500
LUI	A0,8011
LW	A0,A510 (A0)	;A0=p->command position
ADDIU	V0,A0,0008	;V0=p->next command position
LUI	AT,8011
SW	V0,A510 (AT)	;save new command position
SLL	V0,V1,0x1
ANDI	V0,V0,00FF
SLL	V0,V0,0x10	;V0=byte2*20000: vertex 1 of tri 1
SLL	V1,A2,0x9
ANDI	V1,V1,FE00	;V1=byte3*200:	vertex 2 of tri 1
OR	V0,V0,V1
SLL	V1,A3,0x1
ANDI	V1,V1,00FF	;V1=byte4*2:	vertex 3 of tri 1
OR	V0,V0,V1
OR	V0,V0,T5	;V0=tri 1 command:	05FEFEFE
SW	V0,0000 (A0)	;save tri1 command upper word
J	80033EB4
SW	R0,0004 (A0)	;0=tri1 command lower word
//80033EA8:
LW	V0,0000 (S5)
ADDIU	V0,V0,0001
SW	V0,0000 (S5)	;increment value at S5
//80033EB4:
ADDIU	A1,A1,0004	;curpos+=4
ADDIU	S1,S1,0004	;pos+=4
//80033EBC:	test if the next thing is an 04 command
LBU	V0,0000 (S1)	;microcode type
ADDIU	T5,R0,0004
BEQ	V0,T5,80033DA4	;loopus if type is an 04
NOP	
J	80033F20
NOP	

80033ED4:	type A	set image independant of palette!
LW	A1,00A0 (SP)	;A1=
LW	A2,00A8 (SP)	;A2=p->image index
LW	A3,00AC (SP)	;A3=p->palette index
ADDU	A0,S1,R0	;A0=S1: p->geocode
SW	S3,0010 (SP)
JAL	80032978	;write a set texture command
SW	S5,0014 (SP)
J	80033F20
ADDIU	S1,S1,0002	;S1+=2:	update position in geocode

80033EF8:	type B	set palette for current image!
LW	A2,00A0 (SP)	;A2=
LW	A3,00A8 (SP)	;A3=p->image index
LW	T5,00AC (SP)	;T5=p->palette index
ADDU	A0,S1,R0	;A0=S1: p->geocode
ADDIU	A1,SP,0020	;A1=SP+20
SW	S3,0014 (SP)
SW	S5,0018 (SP)
JAL	800334A4	;set palette
SW	T5,0010 (SP)	;SP+10=p->palette index
ADDIU	S1,S1,0002	;S1+=2:	update position in geocode
//80033F20:	loopus until finished with microcode
LBU	A0,0000 (S1)	;A0=type
ADDIU	V0,R0,000C
ANDI	V1,A0,00FF
BNE	V1,V0,8003378C	;branch if it isn't a KILL (C)
SLTIU	V0,V1,000C	;TRUE if type is < C
//80033F34:	set DL link target. That's so cool to link 'em up like that


+-+-+-+

8003FDE0	parse geometry microcode: get vertex and triad counts
	accepts: A0=p->geo, 
ADDU	T0,A0,R0	;T0=A0: p->geometry
SW	R0,0000 (A1)	;0->[80102898]
SW	R0,0000 (A2)	;0->[8010289C]
//8003FDEC:
LBU	A0,0000 (T0)	;A0=command
ADDIU	V0,R0,000C
ANDI	V1,A0,00FF
BEQ	V1,V0,8003FF34	;end when command=12
NOP
LUI	T5,800D
ADDIU	T5,T5,2FE0	;T5=800D2FE0	table of jumps for each routine
ADDIU	T4,R0,0001	;T4=1
ADDIU	T3,R0,0003	;T3=3
ADDIU	T2,R0,0002	;T2=2
ADDIU	T1,R0,000C	;T1=C
//8003FE18:
SLTIU	V0,V1,000C
BEQ	V0,R0,8003FF28	;branch on a bad command
SLL	V0,V1,0x2	;V0=command->offset
ADDU	V0,V0,T5
LW	V0,0000 (V0)	;V0=800D2FE0 + offset: jump for command
JR	V0
NOP

8003FE34	Command 9	-	set rgb
J	8003FF28
ADDIU	T0,T0,0004	;T0+=4

8003FE3C	Command 0	-	8bit vertex index
LBU	V1,0001 (T0)	;V1=#points to follow
LW	V0,0000 (A1)
ADDIU	T0,T0,0001	;p->#entries	p->geo++
ADDU	V0,V0,V1
SW	V0,0000 (A1)
LBU	V1,0000 (T0)
SW	R0,0000 (A3)	;0->A3
SLL	V0,V1,0x1
J	8003FECC
ADDU	V0,V0,V1	;V0=#entries * 3

8003FE64	Command 1	-	16bit vertex index
LBU	V1,0001 (T0)	;V1=#points to follow
LW	V0,0000 (A1)
ADDIU	T0,T0,0001	;p->#entries	p->geo++
ADDU	V0,V0,V1
SW	V0,0000 (A1)
LBU	V1,0000 (T0)	;V1=#entries
SW	T4,0000 (A3)	;1->A3
SLL	V0,V1,0x1
J	8003FEC8
ADDU	V0,V0,V1	;V0=#entries * 3

8003FE8C	Command 3	-	8bit vertex index
LBU	V0,0001 (T0)	;V0=#entries to follow
LW	V1,0000 (A1)
ADDIU	T0,T0,0001	;p->#entries	p->geo++
ADDU	V1,V1,V0
SW	V1,0000 (A1)
LBU	V0,0000 (T0)	;V0=#entries
J	8003FECC
SW	T3,0000 (A3)	;3->A3

8003FEAC	Command 2	-	16bit vertex index
LBU	V1,0001 (T0)	;V0=#entries to follow
LW	V0,0000 (A1)	;V0=#total vertices?
ADDIU	T0,T0,0001	;p->#entries	p->geo++
ADDU	V0,V0,V1	;V0+=#entries
SW	V0,0000 (A1)	;V0->total
LBU	V0,0000 (T0)	;V0=#entries
SW	T2,0000 (A3)	;2->A3
//8003FEC8:
SLL	V0,V0,0x1	;V0=#entries*2
//8003FECC:
ADDIU	V0,V0,0001	;p->vertex data	p->geo++
J	8003FF28
ADDU	T0,T0,V0	;p->geo+=size of vertex data

8003FED8	Command 6	-	textured triads (16bit index)
J	8003FEEC
ADDIU	T0,T0,0002	;p->geo+=2	increment past texture#

8003FEE0	Command 7	-	textured triads (8bit index)
J	8003FEEC
ADDIU	T0,T0,0001	;p->geo++	increment past texture#

8003FEE8	Command 8	-	gaussian triads
ADDIU	T0,T0,0003	;p->geo+=3	increment past rgb data

8003FEEC	Command 5	-	triads (retain any previous attributes)
LBU	A0,0001 (T0)	;A0=#entries
ADDIU	T0,T0,0002	;p->geo+=2	increment past previous command and #entries
LW	V1,0000 (A2)	;V1=#total vertices
SLL	V0,A0,0x1
ADDU	V0,V0,A0	;V0=#entries *3
ADDU	T0,T0,V0	;geo+=size of entries
ADDU	V1,V1,A0	;V1+=#entries
J	8003FF28
SW	V1,0000 (A2)	;save total

8003FF10	Command 4	-	single triad (retain any previous attributes)
LW	V0,0000 (A2)	;V0=#total vertices?
ADDIU	T0,T0,0004	;p->geo+=4	increment past command and 2bytes of data
ADDIU	V0,V0,0001	;total++
J	8003FF28
SW	V0,0000 (A2)	;save total

8003FF24	Command A,B	-	set texture, unknown
ADDIU	T0,T0,0002	;p->geo+=2	increment past previous command and #entries
//8003FF28:
LBU	A0,0000 (T0)	;A0=next command
BNE	A0,T1,8003FE18	;branch if it isn't C
ANDI	V1,A0,00FF	;V1=command
//8003FF24	and that's it!
JR	RA
NOP

+_+

8003FFA4	process microcode
BEQ	V0,R0,80040494
SLL	V0,V1,0x2
LUI	AT,800D
ADDU	AT,AT,V0
LW	V0,3010 (AT)	;V0=800D3010 + offset: routine to handle command
JR	V0
NOP

8003FFC0	Command 9
J	80040494
ADDIU	S0,S0,0004

8003FFC8	Command 0	-	 8bit vertex index
ADDIU	S1,S0,0002	;S1=p->geo+=2
ADDIU	S0,S0,0001	;p->geo++
LBU	V1,0000 (S0)	;V1=#entries
ADDU	S7,R0,R0	;S7=0
SLL	V0,V1,0x1
J	80040028
ADDU	V0,V0,V1	;V0=#entries*3	size of block

8003FFE4	Command 1	-	16bit vertex index
ADDIU	S1,S0,0002	;S1=p->geo+=2
ADDIU	S0,S0,0001	;p->geo++
LBU	V1,0000 (S0)	;V1=#entries
ADDIU	S7,R0,0001	;S7=1
SLL	V0,V1,0x1
J	80040024
ADDU	V0,V0,V1	;V0=#entries*3	size of block

80040000	Command 3	-	8bit ? index
ADDIU	S1,S0,0002	;S1=p->geo+=2
ADDIU	S0,S0,0001	;p->geo++
LBU	V0,0000 (S0)	;V0=#entries
J	80040028
ADDIU	S7,R0,0003	;S7=3

80040014	Command 2	-	16bit ? index
ADDIU	S1,S0,0002	;S1=p->geo+=2
ADDIU	S0,S0,0001	;p->geo++
LBU	V1,0000 (S0)	;V1=#entries
ADDIU	S7,R0,0002	;S7=2
SLL	V0,V1,0x1	;#entries*2
//80040028:	S1=p->vertex data, 
ADDIU	V0,V0,0001	;#entries++
J	80040494
ADDU	S0,S0,V0

80040034	Command 6	-	textured triads (16bit index)
LBU	V0,0001 (S0)	;V0=texture#
ADDIU	S0,S0,0002	;S0=p->#entries
J	80040058
SB	V0,0044 (T1)	;T1+44=texture

80040044	Command 7	-	textured triads (8bit index)
LBU	V0,0001 (S0)	;V0=texture#
ADDIU	S0,S0,0001	;S0=p->#entries
J	80040058
SB	V0,0044 (T1)	;T1+44=texture

80040054	Command 8	-	gaussian triads
ADDIU	S0,S0,0003	;S0=p->#entries

80040058	Command 5	-	triads
LBU	T2,0001 (S0)	;T2=#entries
ADDIU	S0,S0,0002	;S0=p->data
BEQ	T2,R0,80040494	;if there aren't any entries don't waste any time
ADDU	S8,R0,R0	;S8=0
ADDIU	S2,S0,0002	;S2=p->next z
ADDIU	S4,S6,0004	;S4=S6+4: [4]
ADDIU	S3,S5,0002	;S3=p->z in geo-only buffer for vertex indices	[801CB4A8]
//80040074
ADDIU	V0,R0,0002	;V0=2
BEQ	S7,V0,800400DC	;branch if type2 entry
SLTIU	V0,S7,0003	;test if vertex group 0-2
BEQL	V0,R0,80040098	;branch if type3 entry
ADDIU	V0,R0,0003	;V0=3
BEQ	S7,R0,8004012C	;branch if type 0 entry	8bit vertex index
NOP
J	8004018C	;branch if type 1 entry	16bit vertex index
NOP
//80040098:	type3 index
BNE	S7,V0,8004018C	;assume it is type 1 if not type3.  weird test...
NOP
LBU	V0,0000 (S0)	;V0=vertex 1 index
ADDU	V0,S1,V0	;V0=type3data+index
LBU	V1,0000 (V0)	;V1=type3val1
SB	V1,0000 (S5)	;S5=type3val1
LBU	V0,FFFF (S2)	;V0=vertex 2 index
ADDU	V0,S1,V0	;V0=type3data+index
LBU	A0,0000 (V0)	;A0=type3val2
SB	A0,FFFF (S3)	;S5+1=type3val2
LBU	V0,0000 (S2)	;V0=vertex 3 index
ANDI	A2,V1,00FF	;A2=(unsigned) type3val1
ADDU	V0,S1,V0	;V0=type3data+index
LBU	V0,0000 (V0)	;V0=type3val3
ADDIU	S5,S5,0003	;S5+=3
J	8004017C
ANDI	A3,A0,00FF	;A3=(unsigned) type3val2
//800400DC:	type2 entry
LBU	V0,0000 (S0)	;V0=vertex 1 index
SLL	V0,V0,0x1	;V0*=2
ADDU	V0,V0,S1	;V0=index+type3data
LBU	V1,0000 (V0)	;V1=type3val1 -upper
LBU	A1,0001 (V0)	;A1=type3val1 -lower
SLL	V1,V1,0x8
OR	A1,A1,V1	;A1=type3val1
SH	A1,0000 (S6)	;S6=type3val1
LBU	V0,FFFF (S2)	;V0=vertex 2 index
SLL	V0,V0,0x1	;V0*=2
ADDU	V0,V0,S1	;V0=index+type3data
LBU	V1,0000 (V0)	;V1=type3val2 -upper
LBU	A0,0001 (V0)	;A0=type3val2 -lower
SLL	V1,V1,0x8
OR	A0,A0,V1	;A0=type3val2
SH	A0,FFFE (S4)	;S6+2=type3val2
LBU	V0,0000 (S2)	;V0=vertex 3 index
ANDI	A2,A1,FFFF	;A2=type3val1
J	800401F0
ADDIU	S6,S6,0006	;S6+=6
//8004012C:	type0 index
...
//8004017C:
ANDI	V1,V0,00FF	;V1=(unsigned) type3val3
SB	V0,0000 (S3)	;S5+2=type3val3
J	80040218
ADDIU	S3,S3,0003	;S3+=3;
//8004018C:
...
//80040218:
ADDIU	A0,SP,0010	;A0=SP+10
ADDIU	S2,S2,0003	;S2+=3	p->next z
SLL	A1,A2,0x1
LW	V0,0034 (T1)	;V0=T1+34: ?	[801CB340 - series of floating-point values]
ADDU	A1,A1,A2
SLL	A1,A1,0x2	;A1=vert1*12
SLL	A2,A3,0x1
ADDU	A2,A2,A3
SLL	A2,A2,0x2	;A2=vert2*12
SLL	A3,V1,0x1
ADDU	A3,A3,V1
SLL	A3,A3,0x2	;A3=vert3*12
SW	T0,0028 (SP)
SW	T1,002C (SP)
SW	T2,0030 (SP)
ADDU	A1,V0,A1	;A1=table+vert1 offset
ADDU	A2,V0,A2	;A2=table+vert2 offset
JAL	800458C0
ADDU	A3,V0,A3	;A3=table+vert3 offset
//80040264:
LW	T0,0028 (SP)
ADDIU	S0,S0,0003
ADDIU	S8,S8,0001
SH	R0,0000 (T0)
LW	T2,0030 (SP)
LW	T1,002C (SP)
SLTU	V0,S8,T2
BNEZ	V0,80040074
ADDIU	T0,T0,0002
J	80040494
NOP

80040290	Command 4	-	single triad

80040480	Command A	-	set texture
LBU	V0,0001 (S0)
ADDIU	S0,S0,0002
J	80040494
SB	V0,0044 (T1)	;T1+44: save texture!?

80040490	Command B
ADDIU	S0,S0,0002	;p->geo+=2	S0=p->geo
//80040494	loopus
LBU	A0,0000 (S0)	;A0=command
ADDIU	V0,R0,000C
ANDI	V1,A0,00FF
BNE	V1,V0,8003FFA4	;branch if command is less than C
SLTIU	V0,V1,000C
//800404A8:
LW	RA,005C (SP)
LW	S8,0058 (SP)
LW	S7,0054 (SP)
LW	S6,0050 (SP)
LW	S5,004C (SP)
LW	S4,0048 (SP)
LW	S3,0044 (SP)
LW	S2,0040 (SP)
LW	S1,003C (SP)
LW	S0,0038 (SP)
JR	RA
ADDIU	SP,SP,0060

+-+-+-+-+-+

//80041D20:
LW	V0,0024 (S3)
LW	A2,0038 (S4)
LW	A1,0018 (V0)
JAL	8003FF3C	;extract points and geometry code, as well as textures to apply
ADDU	A0,S4,R0
//80041D34:
ADDIU	A0,S4,R0	;A0=S4: 	[801C363C]
ADDIU	A1,S4,0008	;A1=S4+8:	[801C3644]
JAL	8003CB10
ADDIU	A2,S4,0018	;A2=S4+18:	[801C3654]
JAL	80040E5C
ADDU	A0,S4,R0	;A0=S4:		[801C363C]
J	80041D68
NOP



8003CB10:	determine UL/LR coordinates?  guessing...
	accepts: A0=p->position floats, A1=p+8->z position float, A2=p+18->3rd set of position floats
ADDIU	SP,SP,FFB8
SW	S0,0010 (SP)
SW	RA,0014 (SP)
SDC1	F30,0040 (SP)
SDC1	F28,0038 (SP)
SDC1	F26,0030 (SP)
SDC1	F24,0028 (SP)
SDC1	F22,0020 (SP)
SDC1	F20,0018 (SP)
BEQ	A0,R0,8003CCF0
ADDU	S0,A1,R0	;S0=A1: p+8->?
BEQ	S0,R0,8003CCF0
NOP
//8003CB44:
LW	V0,0034 (A0)	;V0=A0+34:	p->position floats
LHU	V1,0042 (A0)	;V1=A0+42:	#points in table
LWC1	F20,0000 (V0)	;F20=xpos
LWC1	F26,0004 (V0)	;F26=ypos
LWC1	F28,0008 (V0)	;F28=zpos
MOV.S	F12,F20		;F12=F20: xpos
MOV.S	F22,F26		;F22=F26: ypos
BEQ	V1,R0,8003CC30
MOV.S	F30,F28		;F30=F28: zpos
//8003CB68:
ADDU	A3,R0,R0	;A3=0
ADDU	A1,V0,R0	;A1=V0: p->position floats
SLL	V0,V1,0x1
ADDU	V0,V0,V1
SLL	V0,V0,0x2	;V0=V1*C: offset to last xyz positions
ADDU	V1,V0,A1	;V1=V0+A1: p->next position floats
//8003CB80:
LWC1	F0,0000 (A1)	;F0=lastxpos
C.LT.S	F0,F12		;TRUE if lastxpos < xpos
NOP
BC1F	8003CB9C	;branch if false
NOP
J	8003CBB0
MOV.S	F12,F0
//8003CB9C:
C.LT.S	F20,F0
NOP
NOP
BC1TL	8003CBB0
MOV.S	F20,F0
//8003CBB0:
LW	V0,0034 (A0)
ADDU	V0,A3,V0
LWC1	F0,0004 (V0)
C.LT.S	F0,F22
NOP
BC1F	8003CBD4
NOP
J	8003CBE8
MOV.S	F22,F0
//8003CBD4:
C.LT.S	F26,F0
NOP
NOP
BC1TL	8003CBE8
MOV.S	F26,F0
//8003CBE8:
LW	V0,0034 (A0)
ADDU	V0,A3,V0
LWC1	F0,0008 (V0)
C.LT.S	F0,F30
NOP
BC1F	8003CC0C
NOP
J	8003CC20
MOV.S	F30,F0
//8003CC0C:
C.LT.S	F28,F0
NOP
NOP
BC1TL	8003CC20
MOV.S	F28,F0
//8003CC20:
ADDIU	A1,A1,000C
SLT	V0,A1,V1
BNEZ	V0,8003CB80
ADDIU	A3,A3,000C
//8003CC30:
SWC1	F20,0004 (A2)
SWC1	F26,000C (A2)
SWC1	F28,0014 (A2)
SWC1	F12,0000 (A2)
SWC1	F22,0008 (A2)
JAL	800828D0
SWC1	F30,0010 (A2)
MOV.S	F24,F0
JAL	800828D0
MOV.S	F12,F20
//8003CC58:
C.LT.S	F24,F0
NOP
NOP
BC1TL	8003CC6C
MOV.S	F24,F20
//8003CC6C:
JAL	800828D0
MOV.S	F12,F22
MOV.S	F22,F0
JAL	800828D0
MOV.S	F12,F26
//8003CC80:
C.LT.S	F22,F0
NOP
NOP
BC1TL	8003CC94
MOV.S	F22,F26
//8003CC94:
JAL	800828D0
MOV.S	F12,F30
MOV.S	F20,F0
JAL	800828D0
MOV.S	F12,F28
//8003CCA8:
C.LT.S	F20,F0
NOP
NOP
BC1TL	8003CCBC
MOV.S	F20,F28
//8003CCBC:
NOP
MUL.S	F12,F24,F24
NOP
MUL.S	F0,F22,F22
NOP
MUL.S	F2,F20,F20
ADD.S	F12,F12,F0
JAL	80082908
ADD.S	F12,F12,F2
//8003CCE0:
SWC1	F0,000C (S0)
SW	R0,0000 (S0)
SW	R0,0004 (S0)
SW	R0,0008 (S0)
//8003CCF0:
LW	RA,0014 (SP)
LW	S0,0010 (SP)
LDC1	F30,0040 (SP)
LDC1	F28,0038 (SP)
LDC1	F26,0030 (SP)
LDC1	F24,0028 (SP)
LDC1	F22,0020 (SP)
LDC1	F20,0018 (SP)
JR	RA
ADDIU	SP,SP,0048


80040E5C:
	accepts: A0=p->loading block thing	[801C363C]
ADDIU	SP,SP,FF78
SW	S3,004C (SP)
ADDU	S3,A0,R0
...
//80040F28:	grab positions of saved geometry
LW	A0,003C (S3)	;A0=S3+3C: p->geodata
ADDU	A0,A0,T3	;A0+=T3: geodata + offset in data
LBU	V1,0000 (A0)	;V1=vertex1
LW	A1,0034 (S3)	;A1=S3+34: p->positions
SLL	V0,V1,0x1
ADDU	V0,V0,V1
LBU	V1,0001 (A0)	;V1=vertex2
SLL	V0,V0,0x2	;V0=V1*C: offset to vertex1 position
ADDU	S7,A1,V0	;S7=A1+V0: p->vertex1 position float
SLL	V0,V1,0x1
ADDU	V0,V0,V1
LBU	V1,0002 (A0)	;V1=vertex3
SLL	V0,V0,0x2	;V0=V1*C: offset to vertex2 position
ADDU	S5,A1,V0	;S5=A1+V0: p->vertex2 position float
SLL	V0,V1,0x1
ADDU	V0,V0,V1
SLL	V0,V0,0x2	;V0=V1*C: offset to vertex3 position
ADDU	S4,A1,V0	;S4=A1+V0: p->vertex3 position float
//80040F70:
ADDU	S1,R0,R0	;S1=0
ADDU	S8,T0,R0	;S8=T0: ?
MTC1	S1,F0
NOP
CVT.S.W	F0,F0	;F0=0
MUL.S	F22,F26,F0	;F22=0
ADDU	S0,R0,R0	;S0=0
SLLV	V0,T4,S1	;V0=T4<<0: V0=T4	[1]
SLL	S6,V0,0x8	;S6=V0*0x100:	[100]
//80040F94:
ADDIU	V0,S1,0001	;V0=1
MTC1	V0,F0
NOP
CVT.S.W	F0,F0	;F0=1.0
MUL.S	F20,F26,F0	;F20=F26: ???	[3CF5F437]
MTC1	S0,F6
NOP
CVT.S.W	F6,F6	;F6=0
LWC1	F8,0018 (S3)	;F8=S3+18: [BE91CEF5]
LWC1	F4,0028 (S3)	;F4=S3+28: [BD0ECEE1]
ADDIU	S2,S0,0001	;S2=1
MUL.S	F6,F24,F6	;F6=0
MTC1	S2,F0
NOP
CVT.S.W	F0,F0	;F0=1.0
ADD.S	F2,F8,F20	;F2=F8+F20	[BE91CEF5+3CF5F437=BE826FB2]
//80040FD4:
ADDU	A0,S7,R0	;A0=p->position floats for vertex1
ADDU	A1,S5,R0	;A1=p->position floats for vertex2
ADDU	A2,S4,R0	;A2=p->position floats for vertex3
ADD.S	F8,F8,F22	;F8+=0
MUL.S	F0,F24,F0	;F0=F24: 	[3BBBA24B]
SW	T0,0028 (SP)	;save T0->SP+28
SW	T1,002C (SP)	;save T1->SP+2C
ADD.S	F6,F4,F6	;F6=F4: 	[BD0ECEE1]
SW	T2,0030 (SP)	;save T2->SP+30
SW	T3,0034 (SP)	;save T3->SP+34
MFC1	A3,F8		;A3=F8: 	[BE91CEF5]
ADD.S	F4,F4,F0
SW	T4,0038 (SP)	;save T4->SP+38
SWC1	F2,0014 (SP)	;save F2->SP+14
SWC1	F6,0010 (SP)	;save F6->SP+10
JAL	8003FA90
SWC1	F4,0018 (SP)	;save F4->SP+18
//80041018:
...
//800410E0:
JR	RA
ADDIU	SP,SP,0088

